package Reproductor;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.CannotWriteException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.KeyNotFoundException;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagException;
import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
import org.jaudiotagger.tag.id3.ID3v11Tag;
import org.jaudiotagger.tag.id3.ID3v1Tag;
import org.jaudiotagger.tag.id3.ID3v22Tag;
import org.jaudiotagger.tag.id3.ID3v23Tag;
import org.jaudiotagger.tag.id3.ID3v24Frames;
import org.jaudiotagger.tag.id3.ID3v24Tag;
import org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag;



public class Cancion implements Comparable,Cloneable{
	

	 /**
	  * Definicion de atributos de la clase cancion.
	  */
	private String titulo;
	private String artista;
	private String album;
	private String formato;
	private String numero;
	private URL direccionURL;
	private String path;
	
	private boolean sonando=false;
	
	 /**
	  * Inicializa los atributos de la cancion a partir de unos parametros dados.
	  * 
	  * @param path: ruta en la que se encuentra la cancion.
	  * (los demas parametros son obvios)
	  */
	public Cancion(String titulo, String artista, String album, String formato, String numero,int duracion,String path){
		this.titulo=titulo;
		this.artista=artista;
		this.album=album;
		this.formato=formato;
		this.numero=numero;
		this.path=path;
		
		try {
			direccionURL=new URL("file:///"+path);
		} catch (MalformedURLException e) {
			System.out.print("No se puedo abrir la cancion");
		}
	}

	 /**
	  * Inicializa los atributos de cancion a partir de la informacion sacada
	  * de su fichero.
	  * 
	  * @param fichero: ruta en la que se enceuntra la cancion que queremos.
	  */
	public Cancion(String fichero){
		titulo="";
		artista="";
		album="";
		formato="";
		numero="";
		path=fichero;
		
		try {
			direccionURL=new URL("file:///"+fichero);
		} catch (MalformedURLException e) {
			System.out.print("No se puedo abrir la cancion");
		}

		Cancion c=Tagger.conseguirValores(fichero.toString());
		titulo=c.getTitulo();
		artista=c.getArtista();
		album=c.getAlbum();
		formato=c.getFormato();
		numero=c.getNumero();
		
	}
	
	 /**
	  * Inicializa la cancion.
	  */
	public Cancion(){
		titulo="";
		artista="";
		album="";
		formato="";
		numero="";
		direccionURL=null;
		path="";
	}
		
	//METODOS GET
	
	 /**
	  * Devuelve el atributo titulo de la cancion.
	  * 
	  * @return: cadena que representa el titulo de la cancion.
	  */
	public String getTitulo(){
		return titulo;
	}
	
	/**
	  * Devuelve el atributo artista de la cancion.
	  * 
	  * @return: cadena que representa al artista de la cancion.
	  */
	public String getArtista(){
		return artista;
	}
	
	 /**
	  * Devuelve el atributo album de la cancion.
	  * 
	  * @return: cadena que representa el album al que pertenece la cancion.
	  */
	public String getAlbum(){
		return album;
	}
	
	 /**
	  * Devuelve el atributo formato de la cancion.
	  * 
	  * @return: cadena que representa el formato de la cancion.
	  */
	public String getFormato(){
		return formato;
	}
	
	 /**
	  * Devuelve el atributo numero de la cancion.
	  * 
	  * @return: cadena que representa el numero de la cancion.
	  */
	public String getNumero(){
		return numero;
	}
	
	/**
	  * Devuelve el atributo URL de la cancion.
	  * 
	  * @return: URL donde se encuentra la cancion.
	  */
	public URL getDireccionURL(){
		return direccionURL;
	}
	
	 /**
	  * Devuelve si una cancion esta sonando o no.
	  * 
	  * @return: booleano que representa si esta sonando o no la cancion.
	  */
	public boolean getSonando(){
		return sonando;
	}

	
	//METODOS SET
	

	 /**
	  * Cambia el atributo sonando de la cancion.
	  * @param b: expresa si esta sonando o no la cancion.
	  */
	public void setSonando(boolean b){
		sonando=b;
	}
	
	/**
	  * Cambia el atributo titulo de la cancion.
	  * @param nuevo: cadena de caracteres que designa el nuevo titulo de 
	  * la cancion.
	  */
	public void setTitulo(String nuevo){
		titulo=nuevo;
		
	}
	
	/**
	  * Cambia el atributo artista de la cancion.
	  * @param nuevo: cadena de caracteres que designa el nuevo nombre del 
	  * artista de la cancion.
	  */
	public void setArtista(String nuevo){
		artista=nuevo;
		
	}
	
	/**
	  * Cambia el atributo album de la cancion.
	  * @param nuevo: cadena de caracteres que designa el nuevo nombre del 
	  * album de la cancion.
	  */
	public void setAlbum(String nuevo){
		album=nuevo;
		//actualizarCancion();
	}
	
	 /**
	  * Cambia el atributo numero de la cancion.
	  * @param nuevo: cadena de caracteres que designa el nuevo 
	  * numero de la cancion.
	  */
	public void setNumero(String nuevo){
		numero=nuevo;
		
	}

	/**
	  * Cambia el formato de la cancion.
	  * @param formato: cadena de caracteres que designa un cambio en el formato 
	  * de la cancion.
	  */
	public void setFormato(String formato) {
		this.formato = formato;
	}

	 /**
	  * Cambia la direccion URL donde se encuentra la cancion.
	  * @param direccion: direccion URL que designa la nueva direccion
	  * donde se encuentra la cancion.
	  */
	public void setDireccion(URL direccion) {
		this.direccionURL = direccion;
	}

	/**
	  * Devuelve la ruta donde se encuentra la cancion.
	  * @return: cadena de caracteres que representa la direccion donde esta 
	  * la cancion.
	  */
	public String getPath() {
		return path;
	}

	/**
	  * Cambia la direccion donde se encuentra la cancion.
	  * @param path: cadena de caracteres que designa la nueva direccion
	  * donde se encuentra la cancion.
	  */
	public void setPath(String path) {
		this.path = path;
	}
	
	/**
	  *Decide donde colocar la cancion dentro de la tabla. 
	  *@return: Devuelve la posicion de la tabla en la que se va a colocar la cancion.
	  */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((album == null) ? 0 : album.hashCode());
		result = prime * result + ((artista == null) ? 0 : artista.hashCode());
		result = prime * result + ((formato == null) ? 0 : formato.hashCode());
		result = prime * result + ((titulo == null) ? 0 : titulo.hashCode());
		return result;
	}

	/**
	  * Compara dos canciones.
	  * @return: true si son iguales las dos canciones y false en caso contrario.
	  */
	@Override
	public boolean equals(Object obj) {
		Cancion c=(Cancion) obj;
		
		boolean b=false;
		
		b=(this.album).equals(c.getAlbum());
		b&=(this.artista).equals(c.getArtista());
		b&=(this.titulo).equals(c.getTitulo());
		b&=(this.formato).equals(c.getFormato());
		b&=(this.path).equals(c.getPath());
		b&=this==c;
		
		return b;
	}

	/**
	  * Compara dos canciones.
	  * @return: 0 si son iguales, 1 si el objeto cancion "o" es
	  * mayor que el principal y -1 en caso de que el objeto cancion
	  * "o" es menos que el principal.
	  */
	@Override
	public int compareTo(Object o) {
		Cancion c=(Cancion)o;
		return (this.path.compareTo(c.getPath()));
	}

	/**
	  * Crea una copia de cancion.
	  * @return: la cancion copiada.
	  */
	@Override
	public Object clone() {
		Cancion c = new Cancion(path);
		c.setAlbum(album);
		c.setArtista(artista);
		c.setFormato(formato);
		c.setNumero(numero);
		c.setSonando(sonando);
		c.setTitulo(titulo);
		return c;
		
		
	}

	/**
	  * Devuelve una cadena de caracteres que muestra informacion sobre
	  * la cancion.
	  * @return: Cadena solucion.
	  */
	@Override
	public String toString() {
		String s="";
		s+="Titulo: "+titulo+"\n";
		s+="Artista: "+artista+"\n";
		s+="Album: "+album+"\n";
		
		return s;
	}
}

